home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / nerf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-18  |  3.0 KB  |  118 lines

  1. static char SCONFail[] = "SCRIPT connect failed: ";
  2. static char SCONFail1[] = "SCRIPT disconnect failed: ";
  3.  
  4. static struct cmds sconcmds[] = {
  5.     "tcp",        scriptconn,    0, 0, NULLCHAR,
  6.     "telnet",    scriptconn,    0, 0, NULLCHAR,
  7. #ifdef AX25
  8.     "ax25",        scriptconn,    0, 0, NULLCHAR,
  9.     "connect",    scriptconn,    0, 0, NULLCHAR,
  10. #endif
  11.     NULLCHAR
  12. };
  13.  
  14.  
  15.  
  16.  
  17. /* open a network connection based upon information in the cc line.
  18.  * m->user is set to the socket number.
  19.  */
  20. static int
  21. scriptconn(argc,argv,p)
  22. int argc;
  23. char *argv[];
  24. void *p;
  25. {
  26. struct world *here;
  27. char sock[MAXSOCKSIZE];
  28. union sp sp;
  29. char ctype;
  30. struct iface *ifp;
  31. char digis[MAXDIGIS][AXALEN];
  32. char target[AXALEN];
  33. int ndigis;
  34.  
  35.     here = (struct world *)p;
  36.     sp.p = sock;
  37.     here->Error[0] = 0;    /* null error string */
  38.     ctype = tolower(*argv[0]);
  39.     if (argc < 2)    {
  40.         sprintf (here->Error, "%sSyntax Error", SCONFail);
  41.         return -1;
  42.     }
  43.  
  44.     switch (ctype)    {
  45. #ifdef AX25
  46.         case 'a':
  47.         case 'c':    /* allow 'c' for 'connect' as well */
  48.             if( ((ifp = if_lookup(argv[1])) == NULLIF) || (ifp->flags & HIDE_PORT)) {
  49.             sprintf(here->Error, "%sUnknown port %s",SCONFail, argv[1]);
  50.                 return -1;
  51.             }
  52.             if(ifp->type != CL_AX25){
  53.                 sprintf(here->Error, "%sPort %s not usable for AX.25 connects",SCONFail, argv[1]);
  54.                 return -1;
  55.             }
  56.             if(setcall(target,argv[2]) == -1){
  57.                 sprintf(here->Error, "%sBad call %s",SCONFail, argv[2]);
  58.                 return -1;
  59.             }
  60.  
  61.             /* If digipeaters are given, put them in the routing table */
  62.             if(argc > 3)    {
  63.                 ndigis = argc - 3;
  64.                 if(ndigis > MAXDIGIS)    {
  65.                     sprintf (here->Error, "%sToo many digipeaters", SCONFail);
  66.                     return -1;
  67.                 }
  68.                 for(i=0;i<ndigis;i++)    {
  69.                     if(setcall(digis[i],argv[i+3]) == -1)    {
  70.                         sprintf(here->Error, "%sBad digipeater call %s",SCONFail, argv[i+3]);
  71.                         return -1;
  72.                     }
  73.                 }
  74.                 if(ax_add(target,AX_AUTO,digis,ndigis,ifp) == NULLAXR)    {
  75.                     sprintf(here->Error, "%sAX25 route add failed", SCONFail);
  76.                     return -1;
  77.                 }
  78.             }
  79.  
  80.             sp.ax->sax_family = AF_AX25;
  81.             strncpy(sp.ax->iface,argv[1],ILEN); /* the interface name */
  82.             setcall(sp.ax->ax25_addr,argv[2]); /* the remote callsign */
  83.             if((here->user = socket(AF_AX25,SOCK_STREAM,0)) == -1)    {
  84.                 sprintf (here->Error, "%sError allocating socket", SCONFail);
  85.                 return -1;
  86.             }
  87.             len = sizeof(*sp.ax);
  88.             break;
  89. #endif
  90.         default:
  91.             sp.in->sin_family = AF_INET;
  92.             if((sp.in->sin_addr.s_addr = resolve(argv[1])) == 0)    {
  93.                 sprintf (here->Error, "%sHost Unknown", SCONFail);
  94.                 return -1;
  95.             }
  96.             /* get the optional port number */
  97.             if(argc > 2)
  98.                 sp.in->sin_port = atoip(argv[2]);
  99.             else
  100.                 sp.in->sin_port = IPPORT_TELNET;
  101.             if((here->user = socket(AF_INET,SOCK_STREAM,0)) == -1)    {
  102.                 sprintf (here->Error, "%sError allocating socket", SCONFail);
  103.                 return -1;
  104.             }
  105.             len = sizeof(*sp.in);
  106.     }
  107.  
  108.     sockmode(here->user,SOCK_ASCII);
  109.     if(connect(here->user,sp.p,len) == -1) {
  110.         sprintf (here->Error, "SCRIPT connect failed: %s errno %d",
  111.                 sockerr(here->user),errno);
  112.         close_s(here->user);
  113.         return -1;
  114.     }
  115.     return here->user;
  116. }
  117.  
  118.